package org.jeecg.modules.wms.service;

import org.jeecg.modules.wms.entity.WmsOutbound;
import org.jeecg.modules.wms.vo.WmsOutboundVO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @Description: 出库单服务接口
 * @Author: jeecg-boot
 * @Date: 2023-07-01
 * @Version: V1.0
 */
public interface IWmsOutboundService extends IService<WmsOutbound> {
    
    /**
     * 分页查询出库单列表
     *
     * @param page 分页参数
     * @param wmsOutbound 查询条件
     * @return 出库单列表
     */
    IPage<WmsOutboundVO> queryOutboundList(Page<WmsOutboundVO> page, WmsOutbound wmsOutbound);
    
    /**
     * 根据ID查询出库单详情
     *
     * @param id 出库单ID
     * @return 出库单详情
     */
    WmsOutboundVO queryById(String id);
    
    /**
     * 新增出库单
     *
     * @param wmsOutboundVO 出库单信息
     * @return 操作结果
     */
    boolean add(WmsOutboundVO wmsOutboundVO);
    
    /**
     * 编辑出库单
     *
     * @param wmsOutboundVO 出库单信息
     * @return 操作结果
     */
    boolean edit(WmsOutboundVO wmsOutboundVO);
    
    /**
     * 删除出库单
     *
     * @param id 出库单ID
     * @return 操作结果
     */
    boolean delete(String id);
    
    /**
     * 取消出库单
     *
     * @param id 出库单ID
     * @return 操作结果
     */
    boolean cancel(String id);
    
    /**
     * 审核出库单
     *
     * @param id 出库单ID
     * @param isPass 是否通过
     * @param remark 审核意见
     * @return 操作结果
     */
    boolean audit(String id, boolean isPass, String remark);
    
    /**
     * 执行出库操作
     *
     * @param id 出库单ID
     * @return 操作结果
     */
    boolean execute(String id);
    
    /**
     * 上传出库凭证
     *
     * @param id 出库单ID
     * @param file 凭证文件
     * @return 操作结果
     */
    boolean uploadVoucher(String id, MultipartFile file);

    /**
     * 根据领料单事件信息创建出库单（处理事件数据结构）
     *
     * @param requisitionId 领料单ID
     * @param requisitionNo 领料单号
     * @param orderId 关联订单ID
     * @param orderNo 关联订单号
     * @param warehouseId 仓库ID
     * @param profileList 型材领料清单（事件数据结构）
     * @param accessoryList 配件领料清单（事件数据结构）
     * @param tenantId 租户ID
     * @return 操作结果
     */
    boolean createOutboundFromRequisition(String requisitionId, String requisitionNo, String orderId, String orderNo, 
                                        String warehouseId, java.util.List<org.jeecg.common.event.RequisitionOutboundEvent.ProfileItem> profileList, 
                                        java.util.List<org.jeecg.common.event.RequisitionOutboundEvent.AccessoryItem> accessoryList, String tenantId);

    /**
     * 一键出库
     *
     * @param id 出库单ID
     * @return 操作结果
     */
    boolean oneClickOutbound(String id);

    /**
     * 移动端一键出库（根据选择的分配方案）
     *
     * @param id 出库单ID
     * @param planIdList 分配方案ID列表
     * @return 操作结果
     */
    boolean oneClickOutboundForMobile(String id, java.util.List<String> planIdList);

    /**
     * 查询当前用户操作的出库单记录
     *
     * @param page 分页参数
     * @param queryParam 查询条件
     * @param planOutboundStartTime 计划出库开始时间
     * @param planOutboundEndTime 计划出库结束时间
     * @param actualOutboundStartTime 实际出库开始时间
     * @param actualOutboundEndTime 实际出库结束时间
     * @param warehouseName 仓库名称
     * @param locationName 库位名称
     * @param materialCode 物料编码
     * @param materialName 物料名称
     * @return 用户操作的出库单记录
     */
    IPage<WmsOutboundVO> getUserOperationRecords(Page<WmsOutboundVO> page, WmsOutbound queryParam,
                                                 String planOutboundStartTime, String planOutboundEndTime,
                                                 String actualOutboundStartTime, String actualOutboundEndTime,
                                                 String warehouseName, String locationName,
                                                 String materialCode, String materialName,
                                                 List<String> statusList, List<String> businessTypeList);

    WmsOutboundVO queryByIdAnUpdateBy(String id, String username);

    List<Map<String, Object>> parseRemainingMaterialExcel(MultipartFile file);

    /**
     * 保存余料出库单导入数据
     *
     * @param dataList 导入的数据列表
     * @param createBy 创建人
     * @return 保存的记录数
     */
    Boolean saveRemainingMaterialOutbound(List<Map<String, Object>> dataList, String createBy);
}